<?php
class Application_Model_Queue extends Xend_Db_Model {
	protected $_dbTableName = 'Application_Model_Table_Queue';
	public function __construct() {
		parent::__construct();
	}

	/**
	 * speichert neue bzw. vorhandene Eintraege in der Tabelle queue ab
	 * @param Application_Model_Schema_Queue $queue
	 * @param int Id des zuletzt abgespeicherten Datensatzes
	 */
	public function save(Application_Model_Schema_Queue $queue) {
		$ret	= null;
		$data = array(
			'actions_id'		=> $queue->action->id,
			'start_time'		=> $queue->startTime,
			'elapsed_time'	=> $queue->elapsedTime
		);

		if($queue->id === null) {
			$ret = $this->getDbTable()->insert($data);

		} else {
			$ret = $this->getDbTable()->update($data, array('id = ?' => $queue->id));
		}

		return (int) $ret;
	}

	/**
	 * fragt alle Queue-Eintraege, die laut den Bedingungen in Frage kommen aus der Datenbank
	 * ab
	 * @param array $where Array mit Bedingungen, die an die Datenbank uebergeben werden
	 * @param array $ref Array mit Tabellen, die verknuepft werden sollen
	 * @return array Array mit den Daten, die aus der Datenbank geladen wurden
	 */
	function findall($where = array(), $ref = array()) {
		$ref		= array_flip($ref);
		$queues = array();
		$select	= $this->_database
			->select()
			->from(
				array('queue'),
        array(
					'queue.id', 'queue.actions_id', 'queue.start_time', 'queue.elapsed_time'
				)
			);

		foreach($this->fetch($select) as $k => $v) {
			$queue = new Application_Model_Schema_Queue();
			$queue
				->setId($v['queue']['id'])
				->setStartTime($v['queue']['start_time'])
				->setElapsedTime($v['queue']['elapsed_time']);

			// -------------------------------------------------------------------------------
			// Referenzen auswerten
			if(!empty($ref)) {

				// Zu Aktionen besteht eine 1:1 Verbindung, deswegen wird zu jedem Queue-Eintrag
				// ein Aktionsdatensatz angelegt
				if(array_key_exists('Actions', $ref)) {
					$action = new Application_Model_Schema_Action();
					$action->setId($v['queue']['actions_id']);

					$queue->setAction($action);
				}
			}

			$queues[(int) $v['queue']['id']] = $queue;
		}

		// -----------------------------------------------------------------------------------
		// Referenzen verknuepfen
		if(empty($ref) === false && empty($queues) === false) {
			if(array_key_exists('Actions', $ref)) {
				$queues = $this->_assignActionReferences($queues);
			}

			if(array_key_exists('QueueResources', $ref)) {
				$queues = $this->_assignResourceReferences($queues);
			}

			if(array_key_exists('QueueObjects', $ref)) {
				$queues = $this->_assignObjectReferences($queues);
			}
		}

		return $queues;
	}

	/**
	 * verknuepft die, per Array uebergebenen, Queue-Eintraege mit den Daten der
	 * referenzierten Aktionen
	 * @param array $sources Array mit den Daten der Queue-Eintraege
	 * @param array $references optionales Array mit den UID der Aktionen
	 * @return array Array der Queue-Eintraege mit den verknuepften Aktion-Daten
	 */
	protected function _assignActionReferences($sources, $references = array()) {

		// falls nicht uebergeben, erstelle ein Reference-Array mit den UIDs der Aktionen
		// die geladen werden sollen
		if(empty($references)) {
			foreach($sources as $source) {
				$references[$source->id] = $source->action->id;
			}
		}

		// lade referenzierte Aktionen
		$actionModel	= new Application_Model_Actions();
		$actionData		= $actionModel->findall(array('actions.id IN (?)' => $references), array('ActionValueResources', 'ActionValueObjects'));

		// Aktionen dem Source (Queue) zuordnen
		foreach($sources as $source) {
			if(array_key_exists($source->action->id, $actionData)) {
				$source->setAction($actionData[$source->action->id]);
			}
		}

		return $sources;
	}

	/**
	 * verknuepft die, per Array uebergebenen, Queue-Eintraege mit den Daten der
	 * referenzierten Resourcen (eventuell TileResourcen)
	 * @param array $sources Array mit den Daten der Queue-Eintraege
	 * @param array $references optionales Array mit den UID der Aktionen
	 * @return array Array der Queue-Eintraege mit den verknuepften Aktion-Daten
	 */
	protected function _assignResourceReferences($sources, $references = array()) {

		// falls nicht uebergeben, erstelle ein Reference-Array mit den UIDs der Aktionen
		// die geladen werden sollen
		if(empty($references)) {
			foreach($sources as $source) {
				$references[] = $source->id;
			}
		}

		// lade referenzierte Resourcen
		$queueResourceModel	= new Application_Model_QueueResources();
		$queueResourceData	= $queueResourceModel->findall(array('queue_resources.queue_id IN (?)' => $references), array('Resources'));

		// Resourcen dem Source (Queue) zuordnen
		foreach($queueResourceData as $queueResource) {
			if(array_key_exists($queueResource->queue->id, $sources)) {
				$sources[$queueResource->queue->id]->setResource($queueResource->resource, $queueResource->resource->resource->id);
			}
		}

		return $sources;
	}

	/**
	 * verknuepft die, per Array uebergebenen, Queue-Eintraege mit den Daten der
	 * referenzierten Objekte
	 * @param array $sources Array mit den Daten der Queue-Eintraege
	 * @param array $references optionales Array mit den UID der Queue-Eintraege
	 * @return array Array der Queue-Eintraege mit den verknuepften Objektdaten
	 */
	protected function _assignObjectReferences($sources, $references = array()) {

		// falls nicht uebergeben, erstelle ein Reference-Array mit den UIDs der Queue-Eintraegen
		// die geladen werden sollen
		if(empty($references)) {
			$references = array_keys($sources);
		}

		// lade referenzierte Resourcen
		$mQueueObject	= new Application_Model_QueueObjects();
		$dQueueObject	= $mQueueObject->findall(array('queue_objects.queue_id IN (?)' => $references), array('GameObjects'));

		// Resourcen dem Source (Queue) zuordnen
		foreach($dQueueObject as $queueObject) {
			if(array_key_exists($queueObject->queue->id, $sources)) {
				$sources[$queueObject->queue->id]->setObject($queueObject->gameObject, $queueObject->gameObject->object->id);
			}
		}

		return $sources;
	}
}
?>